import os
import glob
from pptx import Presentation
from pptx.util import Inches
from PIL import Image
import sys
import subprocess

# 设置控制台输出编码
if sys.platform == 'win32':
    import locale
    try:
        # 尝试设置为UTF-8编码
        sys.stdout.reconfigure(encoding='utf-8')
    except:
        pass

def create_photo_ppt(folder_path, output_file="照片合集.pptx"):
    """
    将指定文件夹中的所有照片插入到PPT中，每张照片一页
    
    参数:
    folder_path: 包含照片的文件夹路径
    output_file: 输出的PPT文件名
    """
    
    # 检查文件夹是否存在
    if not os.path.exists(folder_path):
        print(f"错误：文件夹 '{folder_path}' 不存在！")
        return False
    
    # 支持的图片格式
    image_extensions = ['*.jpg', '*.jpeg', '*.png', '*.bmp', '*.gif', '*.tiff', '*.webp']
    
    # 获取所有图片文件
    image_files = []
    for extension in image_extensions:
        image_files.extend(glob.glob(os.path.join(folder_path, extension)))
        image_files.extend(glob.glob(os.path.join(folder_path, extension.upper())))
    
    if not image_files:
        print(f"在文件夹 '{folder_path}' 中没有找到任何图片文件！")
        return False
    
    # 去除重复文件（可能因为大小写导致重复）
    image_files = list(set(image_files))
    # 按文件名排序
    image_files.sort()
    
    print(f"找到 {len(image_files)} 张图片")
    
    # 创建新的PPT演示文稿
    prs = Presentation()
    
    # 获取幻灯片布局（空白布局）
    blank_slide_layout = prs.slide_layouts[6]  # 空白布局
    
    for i, image_file in enumerate(image_files):
        try:
            print(f"正在处理第 {i+1}/{len(image_files)} 张图片: {os.path.basename(image_file)}")
            
            # 添加新幻灯片
            slide = prs.slides.add_slide(blank_slide_layout)
            
            # 获取图片尺寸
            with Image.open(image_file) as img:
                img_width, img_height = img.size
            
            # 幻灯片尺寸（标准16:9）
            slide_width = prs.slide_width
            slide_height = prs.slide_height
            
            # 计算图片在幻灯片中的最佳尺寸（保持宽高比，最大化填充）
            width_ratio = slide_width / img_width
            height_ratio = slide_height / img_height
            ratio = min(width_ratio, height_ratio) * 0.98  # 减少边距，几乎布满全屏
            
            new_width = int(img_width * ratio)
            new_height = int(img_height * ratio)
            
            # 计算居中位置
            left = (slide_width - new_width) // 2
            top = (slide_height - new_height) // 2
            
            # 插入图片
            pic = slide.shapes.add_picture(
                image_file,
                left, top,
                new_width, new_height
            )
            
        except Exception as e:
            print(f"处理图片 {os.path.basename(image_file)} 时出错: {str(e)}")
            continue
    
    # 保存PPT文件
    try:
        prs.save(output_file)
        print(f"\nPPT文件已成功保存为: {output_file}")
        print(f"共创建了 {len(prs.slides)} 页幻灯片")
        return True
    except Exception as e:
        print(f"保存PPT文件时出错: {str(e)}")
        return False

def open_ppt_file(file_path):
    """
    自动打开PPT文件
    """
    try:
        if os.path.exists(file_path):
            # 获取绝对路径
            abs_path = os.path.abspath(file_path)
            print(f"\n正在打开PPT文件: {abs_path}")
            
            # Windows系统使用os.startfile
            if sys.platform == 'win32':
                os.startfile(abs_path)
            # macOS系统
            elif sys.platform == 'darwin':
                subprocess.run(['open', abs_path])
            # Linux系统
            else:
                subprocess.run(['xdg-open', abs_path])
                
            print("PPT文件已打开！")
            return True
        else:
            print(f"错误：文件 {file_path} 不存在！")
            return False
    except Exception as e:
        print(f"打开PPT文件时出错: {str(e)}")
        return False

if __name__ == "__main__":
    # 指定的照片文件夹路径
    photo_folder = r"C:\Users\fengmo\Downloads\高三英语秋季开学第一课_踏上青春路，启航正当时（全国通用）"
    
    # 输出PPT文件名（保存到图片文件夹中）
    output_ppt = os.path.join(photo_folder, "高三英语秋季开学第一课_照片合集.pptx")
    
    print("开始创建照片PPT...")
    print(f"源文件夹: {photo_folder}")
    print(f"输出文件: {output_ppt}")
    print("-" * 50)
    
    # 创建PPT
    success = create_photo_ppt(photo_folder, output_ppt)
    
    if success:
        print("\n任务完成！")
        print("PPT文件已保存在当前工作目录中。")
        print("=" * 50)
        
        # 自动打开PPT文件
        open_ppt_file(output_ppt)
    else:
        print("\n任务失败！请检查错误信息。")